#include <stdio.h>              // 标准输入输出
#include <stdlib.h>             // 标准函数库
#include <string.h>             // 字符串处理(操作字符数组)

#include "ohos_init.h"          // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h"          // CMSIS-RTOS API V2

#include "temp-humi.h"   // AHT20数字温湿度传感器接口
// #include "gas_sensor.h"
// #include "light_sensor.h"
#include "RainDrop.h"
#include "fire.h"
// #include "hc.h"
// #include "jw01.h"
#include "wifi_connecter.h"     // easy wifi (station模式)
#include "mqtt_task.h"          // MQTT接口

// 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
#define PARAM_HOTSPOT_SSID "jit-OpenAtom"           // AP名称
#define PARAM_HOTSPOT_PSK "jitopenatom"      // AP密码
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中

// 根据之前的“MQTT连接华为云”课程，定义连接需要的参数：

// // 平台接入地址
// #define PARAM_SERVER_ADDR "192.168.31.214"

// // 端口号，MQTT协议对应的是1883
// #define PARAM_SERVER_PORT "1883"

// // 客户端ID
// #define PARAM_CLIENT_ID "Pegasus0001"

// // 用户名
// #define PARAM_USER_NAME "Pegasus0001"

// // 密码
// #define PARAM_PASSWORD "Pegasus0001"

// // 平台接入地址
// #define PARAM_SERVER_ADDR "192.168.31.210"

// // 端口号，MQTT协议对应的是1883
// #define PARAM_SERVER_PORT "1883"

// // 客户端ID
// #define PARAM_CLIENT_ID "smartroom1"

// // 用户名
// #define PARAM_USER_NAME "anran"

// // 密码
// #define PARAM_PASSWORD "123456789"


// 平台接入地址
#define PARAM_SERVER_ADDR "mqtt.xinmiao.net.cn"

// 端口号，MQTT协议对应的是1883
#define PARAM_SERVER_PORT "1883"

// 客户端ID
#define PARAM_CLIENT_ID "smartroom1"

// 用户名
#define PARAM_USER_NAME "mqtttest"

// 密码
#define PARAM_PASSWORD "mqtttest"




// 主线程函数
static void surround(void *arg)
{
    (void)arg;

    // 连接AP
    WifiDeviceConfig config = {0};                      // 定义热点配置
    strcpy(config.ssid, PARAM_HOTSPOT_SSID);            // 设置热点配置中的SSID
    strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);     // 设置热点配置中的密码
    config.securityType = PARAM_HOTSPOT_TYPE;           // 设置热点配置中的加密方式
    osDelay(10);
    int netId = ConnectToHotspot(&config);              // 连接到热点
    if (netId < 0)                                      // 检查是否成功连接到热点
    {
        printf("Connect to AP failed!\r\n");
        return;
    }

    // 初始化并启动MQTT任务，连接MQTT服务器
    MqttTaskInit();                                                     // 初始化并启动MQTT任务
    const char *host = PARAM_SERVER_ADDR;                               // MQTT服务器IP地址
    unsigned short port = atoi(PARAM_SERVER_PORT);                      // MQTT服务器端口
    const char *clientId = PARAM_CLIENT_ID;                             // MQTT客户端ID
    const char *username = PARAM_USER_NAME;                             // MQTT服务器用户名
    const char *password = PARAM_PASSWORD;                              // MQTT服务器密码
    if (MqttTaskConnect(host, port, clientId, username, password) != 0) // 连接MQTT服务器
    {
        printf("Connect to MQTT server failed!\r\n");
        return;
    }

    // 订阅主题
    char *stopic = "Pegasus001/test";                                           // 主题
    int rc = MqttTaskSubscribe(stopic);                                                 // 订阅主题
    if (rc != 0)                                                                        // 检查是否成功订阅主题
    {
        printf("MQTT Subscribe failed!\r\n");
        return;
    }
    printf("MQTT Subscribe OK\r\n");

    char *ptopic_ht = "smartroom/report/temp-humi";//主题
    char *ptopic_gas = "smartroom/report/gas";//主题
    char *ptopic_rain = "smartroom/report/rain";//主题
    char *ptopic_light = "smartroom/report/light";//主题
    char *ptopic_people = "smartroom/report/people";//主题
    char *ptopic_co2 = "smartroom/report/co2";//主题
    char *ptopic_distance = "smartroom/report/distance";//主题

    // JW01Init();

    // 初始化AHT20数字温湿度传感器
    InitTempHumiSensor();
    
    // 工作循环
    while (1)
    {
        //温湿度
        char payload_th[512] = {0};                            // 消息内容
        float temperature = 0.0f;                           // 温度
        float humidity = 0.0f;                              // 湿度
        if (GetTempHumiLevel(&temperature, &humidity) == 0) //成功获取数字温湿度传感器数据
        {

            snprintf(payload_th, sizeof(payload_th),
                     "{\"device_id\":\"smartroom\", \"temperature\":%.2f,\"humidity\":%.2f}", 
                     temperature, humidity);    // 消息内容采用JSON格式

            int rc = MqttTaskPublish(ptopic_ht, payload_th);  // 发布消息
            if (rc != 0)                                // 检查是否成功发布消息
                printf("MQTT Publish failed!\r\n");
            else
                printf("MQTT Publish OK\r\n");
        }


        // //MQ-2
        // char payload_gas[64] = {0};                                         // 消息内容
        // snprintf(payload_gas, sizeof(payload_gas),
        //          "{\"device_id\":\"smartroom\", \"gas\":\"%.2f\"}",
        //          GetGasLevel());                                        // 获取可燃气体传感器数据
        // rc = MqttTaskPublish(ptopic_gas, payload_gas);                      // 发布消息
        // if (rc != 0)                                                    // 检查是否成功发布消息
        //     printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        // else
        //     printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
        // osDelay(10);

        // //light
        // char payload_light[64] = {0};                                         // 消息内容
        // snprintf(payload_light, sizeof(payload_light),
        //          "{\"device_id\":\"smartroom\", \"light\":\"%d\"}",
        //          GetLightLevel());                                      // 获取光敏电阻数据
        // int rc = MqttTaskPublish(ptopic_light, payload_light);                // 发布消息
        // if (rc != 0)                                                    // 检查是否成功发布消息
        //     printf("MQTT Publish failed!\r\n");
        // else
        //     printf("MQTT Publish OK\r\n");
        // osDelay(10);


        //rain_drop
        char payload_rain[64] = {0};                                         // 消息内容
        snprintf(payload_rain, sizeof(payload_rain),
                 "{\"device_id\":\"smartroom\", \"rain\":\"%.2f\"}",
                 GetRainLevel());                                        // 获取雨滴传感器数据
        rc = MqttTaskPublish(ptopic_rain, payload_rain);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        else
            printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
        osDelay(10);


        //火焰传感器
        char payload_people[64] = {0};                                         // 消息内容
        snprintf(payload_people, sizeof(payload_people),
                 "{\"device_id\":\"smartroom\", \"fire\":\"%d\"}",
                 red());                                                // 获取红外传感器数据
        rc = MqttTaskPublish(ptopic_people, payload_people);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        else
            printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
        osDelay(10);
        
        // //二氧化碳
        // char payload_co2[64] = {0};                                         // 消息内容
        // snprintf(payload_co2, sizeof(payload_co2),
        //          "{\"device_id\":\"smartroom\", \"co2\":\"%.2f\"}",
        //          ReadJW01());                                        // 获取可燃气体传感器数据
        // rc = MqttTaskPublish(ptopic_co2, payload_co2);                      // 发布消息
        // if (rc != 0)                                                    // 检查是否成功发布消息
        //     printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        // else
        //     printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
        // osDelay(10);
        
        // //测距
        // char payload_distance[64] = {0};                                         // 消息内容
        // float distance = GetDistance();
        // snprintf(payload_distance, sizeof(payload_distance),
        //          "{\"device_id\":\"smartroom\", \"distance\":\"%.2f\"}",
        //          distance);                                                // 获取超声波测距传感器数据
        // rc = MqttTaskPublish(ptopic_distance, payload_distance);                  // 发布消息
        // if (rc != 0)                                                    // 检查是否成功发布消息
        //     printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        // else
        //     printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
        // osDelay(10);
        
        osDelay(200);                                   // 发布消息间隔2秒
    }
}

// 入口函数
static void Entry(void)
{


    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;

    // 创建线程
    if (osThreadNew(surround, NULL, &attr) == NULL)
    {
        printf("[surround] Falied to create mqttDemoTask!\n");
    }
}


// 运行入口函数
SYS_RUN(Entry);
